package com.szrt.day20170410;

import java.util.Scanner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.szrt.utils.ArrayUtil;

/**
 * 
 * 信息：信息既不是物质，也不是能量。
 * 
 * 
 * 对数组进行  增删改查  crud
 * 
 * 1: 增加   比如在数组 class1704  增加1个新同学   贾梦菊
 * 
 * ??
 * 数组尾部增加1个? 数组下标越界  因为 数组的最大缺点  一旦初始化好了。长度固定不变
 * 
 * 最原始的方法   所有的 api 都不允许使用
 * 		0: 如何避免增加相同的元素?
 * 		    循环数组  取到具体的人  student  然后把这个student 跟   贾梦菊 如果相等 。
 * 			提示该学生已经存在。如果不相等。执行123
 * 			
 * 		1： 新建一个数组   数组的长度是原来的长度+1   
 * 				null  就相当于有了6个位置  但是目前这6个位置上没有人
 * 
 * 
 * 
 * 		2： 循环数组  取到具体的人  student  然后把这个student 迁移到 新的数组中去
 * 
 * 		3：把要增加的元素放到最后
 * 		
 * 
 * 设计方法
 * 
 * public String[] add(String[] array,String target);
 * 
 * break      结束循环   后面的循环都不会执行
 * continue   结束循环   结束本次循环 但是后面的循环继续
 * return     结束循环   结束整个方法
 * 
 * 
 * 姓名     成绩
 * 贾梦菊   30
 * 靳志辉   
 * 何小强   50
 * 
 * @author scott-13926583118
 * 2017年4月10日
 *
 */
public class ArrayCRUDTest {
	
	
	//修改  贾梦菊 修改成  贾宝玉   学生对象的增删改查
	//贾梦菊2  "" null   0 null
	private String[] class1704={"贾梦菊","靳志辉","何小强","罗智壕","张嘉源","罗鼎立"};
	
	
	/**
	 * 在增加1个数 比如  34 后   然后从小到大的顺序排列  快速排序
	 * 
	 * 把  33 修改成35  然后从小到大的顺序排列  快速排序
	 * 
	 * 删除22
	 * 
	 * 查询  在不在
	 */
	private int[] class1704age={21,40,33,22,67};
	
	private  Scanner scanner=null;
	
	
	@Test
	public void detelteByStudentNameTest() throws Exception {
		
		detelteByStudentName(class1704, "小强");
		ArrayUtil.printArry(class1704);
		
	}
	
	
	/**
	 * 从数组中删除1个指定的学生
	 * @param array          数组
	 * @param deleteStduent  要删除的学生
	 */
	public void detelteByStudentName(String[] array,String deleteStduent){
		
		//1 先判断该学生是否在原来的数组中
		int xiaobiao = findStduentByName(array, deleteStduent);
		
		if(xiaobiao==-1){
			System.out.println("该学生不存在。不能删除...");
		}else{
			
			//4
			String[] newArray= new String[array.length-1];
			//2 循环老数组    如果下标 <xiaobiao 原样复制  新的数组中  因为所有的数据都保存在老数组中  新数组里面的数据都是null
			for(int index=0; index<array.length;index++){
				
				// 获取1个值
				String value=array[index];
				
				//如果下标 <xiaobiao原样复制
				if(index<xiaobiao){
					newArray[index]=value;
				}else if(index==xiaobiao){
					//? break return continue
					continue;
				}else{
					newArray[index-1]=value;
				}
				
			}
			
			
			
			//理解的关键 
			class1704 =newArray;
			
		}
		
	}
	
	
	
	/**
	 * 修改学生的测试
	 * @throws Exception
	 */
	@Test
	public void changeStudentByNameTest() throws Exception {
			String oldStudent="何小强";
			String newStduent="贾宝玉";
			changeStudentByName(class1704, oldStudent, newStduent);
			
			ArrayUtil.printArry(class1704);
	}
	
	/**
	 * 
	 * @param array       要修改的数组
	 * @param oldStudent  原来的值
	 * @param newStduent  修改后的值
	 */
	public void changeStudentByName(String[] array, String oldStudent,String newStduent){
		
		
		//1  先判断oldStudent 有没有   如果没有 提示 该学生不存在  如果有  CTRL+O (OPEN)  alt+ 向左的箭头  回来原来的位置
		int xb = findStduentByName(array, oldStudent);
		
		if(xb==-1){
			//该学生不存在
			System.out.println("要修改的学生"+oldStudent+"不存在");
		}else{
			// 操作数组元素的唯一办法就是用下标
			//2 把对应的下标的值修改成newStduent
			array[xb]=newStduent;
		}
	}
	
	/**
	 * 表示在具体的测试方法执行之前  执行的方法  初始化方法：在所有的方法执行之前执行
	 * @throws Exception
	 */
	@Before
	public void before() throws Exception{
		System.out.println("1 所有方法执行之前执行的方法...");
		scanner= new Scanner(System.in);
	}
	
	@After
	public void after() throws Exception{
		
		System.out.println("3 所有方法执行之后执行的方法...");
		scanner.close();
	}
	
	
	@Test
	public void addTest() throws Exception {
		
		System.out.println("2 执行addTest方法");
		
		System.out.println("请输入要增加的学生的姓名：");
		String stduent =scanner.nextLine();
		
		//传地址理解
		class1704 =add(class1704, stduent);
		
		
		ArrayUtil.printArry(class1704);
		
	}
	
	
	@Test
	public void findStduentByNameTest() throws Exception {
		System.out.println("请输入要增加的学生的姓名：");
		String student =scanner.nextLine();
		
		//传地址理解
		int xb =findStduentByName(class1704, student);
		
		if(xb==-1){
			System.out.println("该学生"+student+"在数组中不存在");
		}else{
			System.out.println("该学生"+student+"在数组中存在。该学生的下标="+xb);
		}
		
		
		ArrayUtil.printArry(class1704);
		
	}
	
	
	
	/**
	 * 在数组array增加1个元素target
	 * @param array   老的数组
	 * @param target  需要增加的目标元素
	 * @return
	 */
	public String[] add(String[] array,String target){
		
		//1 如何避免增加相同的元素  套路?
		int xb = findStduentByName(array, target);
		
		if(xb>=0){
			//说明有添加的学生已经存在
			return array;
		}else{
			
			//可以正常新增
			//新建一个数组   数组的长度是原来的长度+1  
			
			
			//5
			int length= array.length;
			String[] newArray = new String[length+1];
			
			
			for(int index=0; index<length;index++){
				String value = array[index];
				
				//一个一个地复制进去  对于数组元素的操作   只能操作下标
				newArray[index]=value;
			}
			
			newArray[length]=target;
			return newArray;
			
			
			
		}
		
		
	}



	/**
	 * 
	 * 查找
	 * 判断要增加的数据target在数组array是否存在
	 * 
	 * 优化 ：如果重复  告诉我重复的哪个学生的
	 * @param array
	 * @param target
	 * @return
	 */
	private int findStduentByName(String[] array, String target) {
		//一开始我就认为在数组中不存在
		int xb=-1;
		for(int index=0;index<array.length;index++){
			String value = array[index];
			if(value.equals(target)){
				//说明该学生已经存在
				return index;
			}
		}
		return xb;
	}

}
